package indi.kider.server.bill.service;

import indi.kider.common.model.apabus.Rent;
import indi.kider.common.model.bill.Bill;
import indi.kider.server.bill.model.MeterAnbsValue;

import java.math.BigDecimal;

/**
 * 账单的接口定义，用于用户账单的生成
 */
public interface ProduceBillService {

    /**
     * 生产所有需要的房租账单
     */
    void produceAllRentBill();

    /**
     * 生产所有消费的账单
     */
    void produceAllConsumeBill();

    /**
     * 生产所有消费的账单
     */
    void produceAllConsumeBill(String billMonth);

    /**
     * 生产房租。
     *
     * @param rentId
     * @return
     */
    Bill produceRentBill(Long rentId);

    /**
     * 生产房租，并进行销账。
     *
     * @param rentId
     * @return
     */
    Bill produceCreditRentBill(Long rentId);

    /**
     * 生产自定义账单。
     *
     * @param rentId
     * @param bill
     * @return
     */
    Bill produceCustomBill(Long rentId, Bill bill);

    /**
     * 删除账单，判断条件为未交账单及可删除，删除同时根据账单类型判断是否更新下次结算日期。
     *
     * @param billId
     * @return
     */
    int delBill(Long billId);

    /**
     * 账单水
     *
     * @param rent
     * @param absn
     * @return
     */
    Bill produceWaterBill(Rent rent, BigDecimal absn, String month);

    /**
     * 公摊账单水
     *
     * @param rent
     * @param absn
     * @return
     */
    Bill produceWaterPublicBill(Rent rent, BigDecimal absn, String month);

    /**
     * 账单电
     *
     * @param rent
     * @param absn
     * @return
     */
    Bill producePowerBill(Rent rent, BigDecimal absn, String month);

    /**
     * 公摊账单电
     *
     * @param rent
     * @param absn
     * @return
     */
    Bill producePowePublicBill(Rent rent, BigDecimal absn, String month);

    /**
     * 网费
     *
     * @param rent
     * @return
     */
    Bill produceNetBill(Rent rent, String month);

    /**
     * 物业费
     *
     * @param rent
     * @return
     */
    Bill producePropertyBill(Rent rent, String month);

    /**
     * 结算账单。
     * <p>
     *     预付费的用户，提示需要充的金额。
     *     后付费的用户，出账单后由用户进行缴费。
     * </p>
     *
     * @param meterAnbsValue
     * @return 1 结算失败
     *         2 获取读数失败
     *         3 预付费金额提示
     */
    int settlementBill(MeterAnbsValue meterAnbsValue);

}
